﻿using NetDh.Lib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

namespace NetDh.Presentation.Common
{
    [ApiActionFilter(TmpTest ="BaseApiController")]//统一身份验证token处理
    [ApiExceptionFilter]//统一异常处理
    public class BaseApiController : ApiController
    {
        /// <summary>
        /// 获取当前请求的UserToken
        /// </summary>
        protected UserToken CurrentUser
        {
            get
            {
                object tmpToken;
                //每一次请求都对应一个Controller实例，如果此次请求有异步调用，对应的Controller实例是唯一的，因此可以用this.Request。
                this.Request.Properties.TryGetValue(TokenHelper.TOKEN_NAME, out tmpToken);
                var token = tmpToken as UserToken;
                if (token == null || token.UserId == null) return null;
                return token;
            }
        }
        /*慎用System.Web.HttpContext.Current，因为在异步线程中它为null(它的取值是根据Thread.CurrentThread)。同步线程中它是正常。*/
        /// <summary>
        /// 封装包含有关单个 HTTP 请求的 HTTP 特定信息的 HTTP 内部对象。比如HttpWrapper.Request获取HttpRequestBase对象。
        /// </summary>
        protected HttpContextWrapper HttpWrapper
        {
            get
            {
                return this.Request.Properties["MS_HttpContext"] as HttpContextWrapper;
            }
        }

        /*另外一种获取参数的方式是Action标记[FromBody]，这时ContentType一般是application/json*/
        /// <summary>
        /// 获取传统请求的post参数，ContentType一般为application/x-www-form-urlencoded
        /// </summary>
        /// <param name="paramName"></param>
        /// <returns></returns>
        protected string ParamValueForPost(string paramName)
        {
            return this.HttpWrapper.Request.Form[paramName];
        }
        /// <summary>
        /// 获取传统请求的get参数，ContentType一般为application/x-www-form-urlencoded
        /// </summary>
        /// <param name="paramName"></param>
        /// <returns></returns>
        protected string ParamValueForGet(string paramName)
        {
            return this.HttpWrapper.Request[paramName];
        }

        //ApiController没有OnAuthorization、OnActionExecuting等时机点。

        //->不可override。访问修改符有protected internal，说明是子类+System.Web.Http程序集可访问。如果override下来，就变成子类+当前NetDh.Presentation.Common程序集可访问。
        //->因此会报override更改了访问限制。
        //protected internal override System.Web.Http.Results.ExceptionResult InternalServerError(Exception exception)
        //{
        //    return base.InternalServerError(exception);
        //}
    }
}
